home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / src / cmdline.dpp < prev    next >
Encoding:
Modula Definition  |  1993-09-24  |  7.8 KB  |  139 lines

  1. DEFINITION MODULE cmdline;
  2. __DEF_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (*****************************************************************************)
  13. (* "GEMDOS":                                                                 *)
  14. (* Durch dieses Modul soll zur Kommandozeile und zum Environment eine aehn-  *)
  15. (* liche Schnittstelle bereitgestellt werden, wie sie fuer C-Programme exi-  *)
  16. (* stiert.                                                                   *)
  17. (* Das Modul sollte als allererstes im Hauptmodul importiert werden, und es  *)
  18. (* sollte kein anderes (System)modul, das sich mit Kommandozeile oder Envi-  *)
  19. (* ronment beschaeftigt, importiert werden (auch auf versteckte Importe aus  *)
  20. (* tieferliegenden Modulen achten). Es kann trotzdem nicht garantiert werden,*)
  21. (* dass dieses Modul mit allen M2-Systemen arbeitet.                         *)
  22. (*                                                                           *)
  23. (* Es wird auf drei Arten nach Argumenten der Kommandozeile gesucht, wobei   *)
  24. (* die angegebene Reihenfolge eingehalten wird; nur wenn nach einem Verfahren*)
  25. (* keine Argumente uebergeben wurden, wird nach der naechsten Moeglichkeit   *)
  26. (* der Argumentuebergabe gesucht:                                            *)
  27. (*                                                                           *)
  28. (* 1) ARGV im Environment (Atari-Standard) bzw. MWC, einschliesslich Erwei-  *)
  29. (*    terung fuer leere Argumente.                                           *)
  30. (* 2) Programmname ueber AES.shell_read, falls die Kommandoparameter mit     *)
  31. (*    denen aus der Basepage uebereinstimmen (auch fuer TOS-Programme).      *)
  32. (*    (Diese Funktion existiert nur, wenn beim Praeprozessieren des Imple-   *)
  33. (*     mentationsmoduls das entsprechende Makro definiert war.)              *)
  34. (* 3) Kommandozeile in der BasePage (Atari-Standard)                         *)
  35. (*                                                                           *)
  36. (*                                                                           *)
  37. (* Ist 'MWCStyle' = TRUE, wird das Laengenbyte der Kommandozeile, das mit    *)
  38. (* dem normalerweise ungueltigen Wert von 127 anzeigt, dass per ARGV Argumen-*)
  39. (* te uebergeben werden, ignoriert. Hierdurch koennen auch aeltere Programme,*)
  40. (* wie z.B. die Shell 'Gulaam' (mit: 'set env_style mw'), die das sehr aehn- *)
  41. (* liche Mark Williams-Verfahren fuer erweiterte Kommandozeile benutzen,     *)
  42. (* Argumente uebergeben.                                                     *)
  43. (*                                                                           *)
  44. (* Die DTA wird auf einen internen Puffer gesetzt, sodass die Kommandozeile  *)
  45. (* in der Basepage nicht dafuer benutzt wird.                                *)
  46. (*                                                                           *)
  47. (* Environment-Variablen duerfen sowohl im ueblichen "UNIX" bzw. "PCDOS"-    *)
  48. (* Format, als auch im "TOS"-Format (Nullbyte zwischen '=' und Variablenwert,*)
  49. (* auch in Gulaam, mit: 'set env_style bm' erreichbar) vorkommen, sie werden,*)
  50. (* falls noetig, auf das "UNIX"-Format korrigiert.                           *)
  51. (*---------------------------------------------------------------------------*)
  52. (* 18-Sep-93, Holger Kleinschmidt                                            *)
  53. (*****************************************************************************)
  54.  
  55. FROM types IMPORT
  56. (* TYPE *) StrPtr, StrArray, ArrayRange;
  57.  
  58. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  59.  
  60. #ifdef __GEMDOS__
  61. CONST
  62.   MWCStyle = TRUE;
  63. #endif
  64.  
  65. VAR
  66.   environ : StrArray;
  67.  
  68. (* environ^[i] liefert einen Zeiger auf die i-te Environmentvariable.
  69.  * Das Ende des Environments wird durch einen NULL-Zeiger (NICHT NIL!)
  70.  * gekennzeichnet.
  71.  *
  72.  * ACHTUNG: Die Adressen zeigen direkt in die entsprechenden Strukturen und
  73.  *          duerfen nicht dazu verwendet werden, diese zu veraendern!
  74.  *          Ueberhaupt sollte stattdessen "getenv()" oder "GetEnvVar()"
  75.  *          benutzt werden.
  76.  *
  77.  * ACHTUNG2:Es ist NICHT garantiert, dass die einzelnen Environment-
  78.  *          Strings direkt hintereinander im Speicher abgelegt sind;
  79.  *          lediglich die Adressen der Strings stehen hintereinander im Feld.
  80.  *)
  81.  
  82. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  83.  
  84.  PROCEDURE main ((* -- /AUS *) VAR argc : ArrayRange;
  85.                  (* -- /AUS *) VAR argv : StrArray   );
  86.  
  87. (*--------------------------------------------------------------------------
  88.  | Nach dem Aufruf enthaelt <argc> die Anzahl der Programmargumente ein-    |
  89.  | schliesslich des Programmnamens; <argv>^[i] liefert einen Zeiger auf das |
  90.  | i-te Argument (Programmname: 0-tes Argument). Um das Ende des Zeiger-    |
  91.  | feldes zu kennzeichnen, ist der Zeiger nach dem letzten gueltigen ein    |
  92.  | NULL-Zeiger (nicht: NIL); damit gilt: <argv>^[argc] = NULL.              |
  93.  | Fuer das Abspeichern der Zeigerfelder (einschliesslich des Feldes fuer   |
  94.  | die Environmentvariablen) wird bei Programmstart Speicher vom Betriebs-  |
  95.  | system angefordert; nur wenn kein Speicher mehr frei ist, liefert <argc> |
  96.  | gleich Null, sonst ist <argc> mindestens = eins, wenn auch der Programm- |
  97.  | name nicht immer einwandfrei festgestellt werden kann (dann ist          |
  98.  | <argv>^[0]^ = "").                                                       |
  99.  |                                                                          |
  100.  | Die Prozedur kann beliebig oft und an beliebiger Stelle aufgerufen werden|
  101.  | da saemtliche Initialisierungen schon beim Programmstart vorgenommen     |
  102.  | werden.                                                                  |
  103.  |                                                                          |
  104.  | Achtung: Die Adressen zeigen direkt in die entsprechenden Strukturen und |
  105.  |          duerfen nicht dazu verwendet werden, diese zu veraendern!       |
  106.  |          Die einzelnen Environmentstrings liegen nicht unbedingt hinter- |
  107.  |          einander, lediglich ihre Anfangsadressen!                       |
  108.   --------------------------------------------------------------------------*)
  109.  
  110.  PROCEDURE getenv ((* EIN/ -- *) REF var : ARRAY OF CHAR ): StrPtr;
  111.  
  112. (*--------------------------------------------------------------------------
  113.  | Falls die Environmentvariable <var> existiert, wird als Funktionswert die|
  114.  | Adresse des Wertes der Variablen nach dem '=' geliefert, ansonsten ein   |
  115.  | NULL-Pointer.                                                            |
  116.  |                                                                          |
  117.  | Achtung: Die Adresse zeigt direkt ins Environment und darf nicht dazu    |
  118.  |          benutzt werden, dieses zu veraendern!                           |
  119.   --------------------------------------------------------------------------*)
  120.  
  121.  
  122. (* nicht POSIX: *)
  123. (*===========================================================================*)
  124. (* Die folgenden Prozeduren sind bequemer als "main()" und "getenv()", haben *)
  125. (* aber den Nachteil, dass die Ergebnisstrings <arg> und <val> in der Laenge *)
  126. (* durch den jeweiligen Parameter begrenzt sind.                             *)
  127. (*===========================================================================*)
  128.  
  129.  
  130.  PROCEDURE ArgCount ( ): CARDINAL;
  131.  
  132.  PROCEDURE GetArg ((* EIN/ -- *)     i   : CARDINAL;
  133.                    (* -- /AUS *) VAR arg : ARRAY OF CHAR );
  134.  
  135.  PROCEDURE GetEnvVar ((* EIN/ -- *) REF var : ARRAY OF CHAR;
  136.                       (* -- /AUS *) VAR val : ARRAY OF CHAR ): BOOLEAN;
  137.  
  138. END cmdline.
  139.